<?php defined('SYSPATH') or die('No direct script access.');
/**
 * AJAX JSON controller class
 *
 * @created 2012
 * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
 *
 */

class Controller_Ajax extends Controller
{
    public $config; //общие настройки сайта
    protected $amz; //объект модели (прослойки) для обращения к АПИ

    protected $user;

    private $body = ''; //ответ пользователю (может быть строкой или массивом)

    public function before()
    {
        parent::before();
        $this->config = Kohana::$config->load('site');
        $this->amz = Model_Api::factory($this->config);

        $auth = Auth::instance();
        $this->user = $auth->get_user(FALSE);
        $this->isAdmin = $auth->logged_in('admin');
    }

    /**
     * Empty example action method
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function action_index()
    {
        $this->body = 'Hello';
    }

    /**
     * #ID1 Search items from different categories
     *
     * @param string $_POST['query'] строка запроса
     * @param int    $_POST['page'] номер страницы
     * @param array  $_POST['additinal'] дополниельные критерии
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     * @return array (ASIN, src, price, model, title)
     */
    public function action_search()
    {
        if(isset($_POST['query']))
        {
            //Учет количества запросов поиска
            try
            {
                DB::insert('requests')->values(array(1, $_POST['query']))->execute();
            }
            catch(Kohana_Database_Exception $dbe)
            {
                DB::update('requests')->set(array('count' => Db::expr('count+1')))
                    ->where('text','=',$_POST['query']) ->execute();
            }
        }

        try //при формировании AJAX ответа не должно произойти исключение
        { // с сообщением об ошибке в виде HTML страницы
            // Отвечаем массивом товаров
            $additional=array();
            
            if(isset($_POST['Title']))
                $additional['Title'] = $_POST['Title'];
            if(isset($_POST['Manufacturer']))
                $additional['Manufacturer'] = $_POST['Manufacturer'];
            if(isset($_POST['MaxPrice']))
            {
                $price = $_POST['MaxPrice'];
                if(strpos($price, '.'))
                    str_replace('.', '', $price);
                elseif(strpos($price, ','))
                    str_replace(',', '', $price);
                else
                    $price .= '00';
                $additional['MaximumPrice'] = $price;
            }
            if(isset($_POST['MinPrice']))
            {
                $price = $_POST['MinPrice'];
                if(strpos($price, '.'))
                    str_replace('.', '', $price);
                elseif(strpos($price, ','))
                    str_replace(',', '', $price);
                else
                    $price .= '00';
                $additional['MinimumPrice'] = $price;
            }

            $additional['Condition'] = 'Used';

            $this->body = $this->amz->search(
                isset($_POST['cat']) && $_POST['cat'] > 0 ? $_POST['cat'] : NULL,
                isset($_POST['query']) ? $_POST['query'] : '',
                isset($_POST['page']) ? $_POST['page'] : 1,
                $additional
            );

            //получаем список того, что должно быть на главной
            if ($this->isAdmin)
            {
                $mItems = Model_Product::getMainPageItems();
            }

            //Обрезаем заголовки до 150 символов
            foreach ($this->body as $i => $item)
            {
                if (isset($item['title'])
                    && mb_strlen($item['title'], 'UTF-8') > 150
                )
                {
                    $this->body[$i]['title']
                        = mb_substr($item['title'], 0, 150, 'UTF-8') . '... ';
                           // =$_POST['Title'];
                }


                //Для кнопки "Добавить на главную" получаем текущее состояние
                if (isset($this->body[$i]['title']))
                {
                    //Нужно ли показывать кнопку добавления в вишлист
                    $this->body[$i]['wList'] = (int)($this->user === FALSE)
                        ?
                        0 //не нужно, т.к. пользователь не авторизован
                        : //или иначе в зависимости от того, есть ли уже в нем
                        (0 == DB::select()->from('wishlists')
                            ->where('user_id', '=', $this->user->id)
                            ->and_where('asin', '=', $item['ASIN'])
                            ->limit(1)->execute()->count());

                    if ($this->isAdmin)
                    {
                        $this->body[$i]['main'] = 0;
                        if (is_array($mItems))
                        {
                            foreach ($mItems as $i2 => $item2)
                            {
                                if (isset($item2['ASIN'])
                                    && $item2['ASIN'] == $item['ASIN']
                                )
                                {
                                    $this->body[$i]['main'] = 1;
                                    $mItems[$i2] = $item;
                                    break;
                                }
                            }
                        }
                    } else
                    {
                        $this->body[$i]['main'] = -1;
                    }
                }
            }

            //Обновление кэша главной
            if ($this->isAdmin && is_array($mItems))
            {
                Model_Product::setMainPageItems($mItems);
            }
        } catch (Exception $error)
        {
            $this->body = '#Error: ' . $error->getMessage();// $error->getTraceAsString();
        }
    }

    /**
     * Запускать ежедневно для уведомления о доходах
     * #ID10 Order reporting via amazon user cabinet
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function action_dailyCron()
    {
        Model_Order::notify(
            $this->config->notifyEmail,
            View::factory('notifyEmail'),
            $this->config->affiliateLogin,
            $this->config->affiliatePassword
        );
        $this->body = 'Ok';
    }

    /**
     * Устанавливает для продукта - отображать ли его на главной
     * #ID12 Setting the most popular items on the home page
     *              URI: /ajax/productOnMainPage
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function action_productOnMainPage()
    {

        if (!$this->isAdmin)
        {
            $this->body = 'Permission denied';
        } elseif (isset($_POST['product'], $_POST['main']))
        {
            $mItems = Model_Product::getMainPageItems();
            if (is_array($mItems))
            {
                foreach ($mItems as $index => $item)
                {
                    if ($item['ASIN'] == $_POST['product'])
                    { //Нашли продукт в списке главной
                        if ($_POST['main']) //так все и должно быть
                        {
                            return $this->body = 'Ok';
                        } //- оставляем товар в списке
                        else //нужно удалить из списка
                        {
                            unset($mItems[$index]);
                            Model_Product::setMainPageItems($mItems);
                            return $this->body = 'Ok';
                        }
                    }
                }
            }
            //продукт не найден в списке
            if ($_POST['main']) //если он должен там быть, добавим
            {
                if (!is_array($mItems))
                {
                    $mItems = array();
                }
                $lookup = $this->amz->lookupMedium($_POST['product']);
                if (isset($lookup[0]))
                {
                    $mItems[] = $lookup[0];
                }
                Model_Product::setMainPageItems($mItems);
                return $this->body = 'Ok';
            }
        }
    }

    /**
     * Ajax get comments
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function action_comments()
    {
        $comments = DB::select('comments.*', 'username')->from('comments')
            ->join('users')->on('user', '=', 'users.id')
            ->where(
            'comments.asin', '=',
            isset($_POST['asin']) ? $_POST['asin'] : ''
        );
        if (isset($_POST['id']))
        {
            $comments->where('comments.id', '<=', $_POST['id']);
        }

        $limit = isset($_POST['limit']) ? (int)$_POST['limit'] : 10;
        $offset = isset($_POST['start']) ? (int) $_POST['start'] : 0;

        if ($limit && !isset($_POST['id']))
        {
            $comments->limit($limit);
        }
        else//if(!$limit)
        {
            $comments->limit(1000);//не более 1000 комментариев на 1 странице (при первой загрузке)
        }
        $this->body = $comments
           ->offset($offset)
            ->execute()
            ->as_array();
        foreach ($this->body as $i => $item)
        {
            $this->body[$i]['username'] = htmlspecialchars($item['username']);
            $this->body[$i]['text'] = nl2br(htmlspecialchars($item['text']));
            $this->body[$i]['time'] = date('m.d.Y H:i:s', $item['time']);
        }

    }

    public function action_autoComplete()
    {
        $this->body = array();

        if (isset($_GET['term']))
        {
            $this->body = array_keys(
                DB::select('text')->from('requests')
                    ->where('text', 'LIKE', DB::expr( '"%' . str_replace('"', "'", $_GET['term'])  . '%"'))
                    ->order_by('count', 'desc')
                    ->limit(10)
                    ->execute()
                    ->as_array('text')
            );
        }
    }

    /**
     * All actions respons with JSON encoded content
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function after()
    {
        parent::after();
        $this->response->headers(
            array(
                 'Content-Type'  => 'application/json',
                 'Cache-Control' =>
                 'no-cache, must-revalidate, post-check=0, pre-check=0',
                 'Pragma'        => 'no-cache'
            )
        );
        // Response Json only!
        $this->response->body(json_encode($this->body));

    }
}